package edu.xidian.onlinedocument.utils.ot.json;

import edu.xidian.onlinedocument.utils.ot.internal.operations.Change;
import edu.xidian.onlinedocument.utils.ot.internal.operations.Delete;
import edu.xidian.onlinedocument.utils.ot.internal.operations.Insert;
import edu.xidian.onlinedocument.utils.ot.internal.operations.Retain;
import org.apache.commons.lang3.StringUtils;

public class OperationClass {
    public static Change getChange(ChangeJSON data) {
        Change change = null;

        String opName = data.getOpName();

        // 当操作名称为retain时，创建一个Retain类
        if (isRetain(opName)) {
            if(checkOpLength(data.getOpLength())) {
                change = new Retain(data.getOpLength());
            }
        }
        // 当操作名称为insert时，创建一个Insert类
        else if (isInsert(opName)) {
            if(checkOpText(data.getOpValue())) {
                change = new Insert(data.getOpValue());
            }
        }
        // 当操作名称为delete时，创建一个Delete类
        else if (isDelete(opName)) {
            if(checkOpLength(data.getOpLength())) {
                change = new Delete(data.getOpLength());
            }
        }
        return change;
    }

    public static String OprationName(Class opClass) {
        if(opClass.equals(Retain.class)) {
            return OperationNameToClass.Retain.getOpName();
        }
        else if(opClass.equals(Insert.class)) {
            return OperationNameToClass.Insert.getOpName();
        }
        else if(opClass.equals(Delete.class)) {
            return OperationNameToClass.Delete.getOpName();
        }
        return null;
    }

    public static boolean isInsert(String opName) {
        return OperationNameToClass.Insert.opName.equals(opName);
    }

    public static boolean isRetain(String opName) {
        return OperationNameToClass.Retain.opName.equals(opName);
    }

    public static boolean isDelete(String opName) {
        return OperationNameToClass.Delete.opName.equals(opName);
    }

    private static boolean checkOpLength(Integer length) {
        if(length == null) {
            // throw new IllegalArgumentException("operation length is null");
            return false;
        }
        return true;
    }

    private static boolean checkOpText(String text) {
        // 注意，StringUtils.isBlank()在仅有'\n','\r','\t','f'等空白符时也会判断为空
        // 其定义为：判断某字符串是否为空或长度为0或由空白符(whitespace) 构成
        // 可以用isEmpty()代替，其定义为：判断某字符串是否为空，即是否为null
        if(StringUtils.isEmpty(text)) {
            // throw new IllegalArgumentException("operation text is null");
            return false;
        }
        return true;
    }
}
